#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>

#define PAGE_SIZE 4096  // 这是常见的页面大小，但实际上应该使用系统调用获取
#define num 100

// gcc -std=c99 bigrestest.c -lrt
// ./a.out
// htop 观察 RES
int main() {
    // 打开一个共享内存对象
    int fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    if (fd == -1) {
        perror("shm_open");
        return 1;
    }

    // 设置共享内存对象的大小
    if (ftruncate(fd, PAGE_SIZE * 1024 * num) == -1) {
        perror("ftruncate");
        return 1;
    }

    // 创建 N 个映射到同一块共享内存的内存映射
    for (int i = 0; i < num; i++) {
        void *addr = mmap(NULL, PAGE_SIZE * 1024 * num, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
        if (addr == MAP_FAILED) {
            perror("mmap");
            return 1;
        }

        for (int i = 0; i < 1024 * num; i++) {
            ((char*)addr)[i * PAGE_SIZE] = 1;
        }

        printf("Shared memory mapped at address %p\n", addr);
    }

    // 现在我们有 N 个不同的虚拟内存地址，它们都映射到同一块共享内存

    // 使程序暂停，便于观察其内存使用
    getchar();

    return 0;
}
